using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
namespace Entidades
{
    public class Pregunta : IComparable<Pregunta>
    {
        private const string __ErrorAlta = "No se pudo dar el alta (Pregunta), ";
        private const string __ErrorBaja = "No se pudo dar la baja (Pregunta), ";
        private const string __ErrorModificacion = "No se pudo hacer la modificacion (Pregunta), ";
        private const string __ErrorTraerUno = "No se pudo Traer Uno (Pregunta), ";
        private const string __ErrorTraerTodos = "No se pudo Traer Todos (Pregunta), ";
        private int _Id;
        private int _IdPostulacion;
        private int _IdUsuario;
        private string _Pregunta;
        private DateTime? _FechaAlta;
        private DateTime? _FechaBaja;
        private int _IdMotivoBajaPregunta;
        private DateTime? _FechaLeido;

        private int _IdUsuarioBajaPregunta;
        #region "Propiedades"

        public int Id
        {
            get { return _Id; }
            set { _Id = value; }
        }
        public int IdPostulacion
        {
            get { return _IdPostulacion; }
            set { _IdPostulacion = value; }
        }
        public int IdUsuario
        {
            get { return _IdUsuario; }
            set { _IdUsuario = value; }
        }
        public string strPregunta
        {
            get { return _Pregunta; }
            set { _Pregunta = value; }
        }
        public DateTime? FechaAlta
        {
            get { return _FechaAlta; }
            set { _FechaAlta = value; }
        }
        public DateTime? FechaBaja
        {
            get { return _FechaBaja; }
            set { _FechaBaja = value; }
        }
        public int IdMotivoBajaPregunta
        {
            get { return _IdMotivoBajaPregunta; }
            set { _IdMotivoBajaPregunta = value; }
        }
        public int IdUsuarioBajaPregunta
        {
            get { return _IdUsuarioBajaPregunta; }
            set { _IdUsuarioBajaPregunta = value; }
        }

        public DateTime? FechaLeido
        {
            get { return _FechaLeido; }
            set { _FechaLeido = value; }
        }


        #endregion
        #region "Lazys"
        private Respuesta _Respuesta;
        public Respuesta Respuesta
        {
            get
            {
                if (_Respuesta == null)
                {
                    _Respuesta = Entidades.Respuesta.getOneByIdPregunta(_Id);
                }
                return _Respuesta;
            }
        }
        private Postulacion _Postulacion;
        public Postulacion Postulacion
        {
            get
            {
                if (_Postulacion == null)
                {
                    _Postulacion = new Postulacion(_IdPostulacion);
                }
                return _Postulacion;
            }
        }
        private Usuario _Usuario;
        public Usuario Usuario
        {
            get
            {
                if (_Usuario == null)
                {
                    _Usuario = new Usuario(_IdUsuario);
                }
                return _Usuario;
            }
        }
        #endregion
        public Pregunta()
        {
            _Pregunta = "";
        }
        public Pregunta(int Id)
        {
            Pregunta pregunta = traerUno(Id);
            this._Id = pregunta.Id;
            this._IdPostulacion = pregunta.IdPostulacion;
            this._IdUsuario = pregunta.IdUsuario;
            this._Pregunta = pregunta.strPregunta;
            this._FechaAlta = pregunta.FechaAlta;
            this._FechaBaja = pregunta.FechaBaja;
            this._IdMotivoBajaPregunta = pregunta.IdMotivoBajaPregunta;
            this._IdUsuarioBajaPregunta = pregunta.IdUsuarioBajaPregunta;
        }
        #region "Metodos Publicos"

        public void Alta()
        {
            validaAlta();
            DALPregunta.Alta(this);
        }
        public void Baja()
        {
            try
            {
                validaBaja();
                DALPregunta.Baja(_Id);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorBaja + ex.Message);
            }
        }
        public void Modificar()
        {
            try
            {
                validaModificacion();
                DALPregunta.Modificar(this);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorModificacion + ex.Message);
            }
        }
        public void MarcarComoLeido()
        {
            try
            {
                DALPregunta.MarcarComoLeido(this);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorModificacion + ex.Message);
            }
        }
        #region "Metodos Estaticos"
        private Pregunta traerUno(int Id)
        {
            try
            {
                return DALPregunta.traerUno(Id);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorTraerUno + ex.Message);
            }
        }
        public static List<Pregunta> TraerTodos()
        {
            try
            {
                return DALPregunta.TraerTodos();
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorTraerTodos + ex.Message);
            }
        }

        public static List<Pregunta> TraerTodasParaElUsuario(int idUsuario)
        {
            try
            {
                return DALPregunta.TraerTodasParaElUsuario(idUsuario);
            }
            catch (Exception ex)
            {
                throw new Exception(__ErrorTraerTodos + ex.Message);
            }
        }

        #region "Lazys"
        public static List<Pregunta> getAllByIdPostulacion(int IdPostulacion)
        {
            try
            {
                return DALPregunta.getAllByIdPostulacion(IdPostulacion);
            }
            catch (Exception ex)
            {
                throw new Exception("ErrorDeLazyLoad(Pregunta)" + ex.Message);
            }
        }
        public static List<Pregunta> getAllByIdUsuario(int IdUsuario)
        {
            try
            {
                return DALPregunta.getAllByIdUsuario(IdUsuario);
            }
            catch (Exception ex)
            {
                throw new Exception("ErrorDeLazyLoad(Pregunta)" + ex.Message);
            }
        }
        #endregion
        #endregion
        #endregion
        #region "Metodos Privados"
        private void validaAlta()
        {
            if (_Pregunta.Trim() == "")
                throw new Exception("La pregunta no puede estar vacia");
        }
        private void validaBaja()
        {
            //lanza excepcion si no valida
        }
        private void validaModificacion()
        {
            validaAlta();
        }
        #endregion




        public int CompareTo(Pregunta other)
        {
            if (this.FechaAlta >= other.FechaAlta)
                return -1;

            return 1;
        }


    }
}
